'''
【脚本作者】
郝伟

【主要作用】
用于将单文件中以行为单位的Json数据转换为标准的CSV文件。
运行此程序后，每行一个的JSON对象将被合并到一个二维表中，
并且每个JSON对象的键将成为CSV文件的列名。
最后将此二维表保存为CSV格式。

【运行命令】
    python json2csv.py infile [outfile]
    
    infile 输入的json文件
    outfile 输出的目标文件，可为空，缺省值为 output.csv
  
【更新历史】
2024/04/17 完成并添加本脚本。
'''
import sys, os
import json
import csv  

# 初始化输入和输出文件路径
input_file_path = 'abc.json'
output_file_path = 'output.csv'
if len(sys.argv) > 1 and os.path.exists(sys.argv[1]):
    input_file_path = sys.argv[1]
if len(sys.argv) > 2:
    output_file_path = sys.argv[2]

# 显示输入输出信息
print('input: ', input_file_path)
print('output:', output_file_path)


# 读取所有JSON对象并解析它们
print("Loading json file...")
if not os.path.exists(input_file_path):
    print(f'Exited unexpectedly. InputNotFoundException: "{input_file_path}" does not exist.')
    exit(-1)

json_objects = []  
with open(input_file_path, 'r', encoding="UTF-8") as file:  
    for line in file:  
        json_object = json.loads(line)  
        json_objects.append(json_object)  


# 确定所有JSON对象共有的键，这些键将成为CSV文件的列名  
print("Converting json to csv...")
keys = set()  
for obj in json_objects:  
    keys.update(obj.keys())  

# 将所有JSON对象的值写入CSV文件  
print("Writing csv to output file...")
with open(output_file_path, 'w', newline='', encoding="UTF-8") as csvfile:  
    fieldnames = list(keys)  
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()        # 写入列名  
    for obj in json_objects:    # 循环写入所有对象
        writer.writerow(obj)    # 写入每个JSON对象的值  

print(f'The converted CSV file is saved to "{output_file_path}"')